import com.sun.source.tree.Tree;

import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RandomName {
    public static void main(String[] args) throws IOException {
        // 获取姓
        String surnameUrl = "https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d";
        // 获取男名
        String boyNameUrl = "https://lang-zh.com/boy-name.html";
        // 获取女名
        String girlNameUrl = "https://lang-zh.com/girl-name.html";

        // 获取姓名
        String firstName = getNamesNet(surnameUrl);
        // 获取男名
        String lastNameBoy = getNamesNet(boyNameUrl);
        // 获取女名
        String lastNameGirl = getNamesNet(girlNameUrl);
        // 获取单字男名
        ArrayList <String> firstNameTempData = getData(firstName, "(.{4})(，|。)(?:[\\u4e00-\\u9fa5·])",1);
        // 获取双字男名
        ArrayList <String> boyNameTempData = getData(lastNameBoy, "(?:[\\u4e00-\\u9fa5·]{2})",0);
        // 获取双字女名
        ArrayList <String> girlNameTempData = getData(firstName, "(?:[\\u4e00-\\u9fa5·]{2})",0);

        // 将单字男名和双字男名合并
        ArrayList<String> firstNameData = new ArrayList<>();
        for (String s : firstNameTempData) {
            for (int i = 0; i < s.length(); i++) {
                char ch = s.charAt(i);
                firstNameData.add(ch + "");
            }

        }
        // 将双字男名和双字女名合并
        ArrayList<String> boyNameData = new ArrayList<>();
        for (String s : boyNameTempData) {
            String s1 = s.split(",")[0];
            boyNameData.add(s1);

        }
        // 将双字女名和单字男名合并
        ArrayList<String> girlNameData = new ArrayList<>();
        for (String s : girlNameTempData) {
            String s1 = s.split(",")[0];
            girlNameData.add(s1);
        }
        // 获取最终结果
        ArrayList<String> list = getInsos(firstNameData,boyNameData,girlNameData,100,100);
        // 打乱顺序
        Collections.shuffle(list);

        // 将结果写入文件
        BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\Java\\Text\\name.txt"));
        for (String str : list) {
            bw.write(str);
            bw.newLine();
        }
        bw.close();
    }

    public static ArrayList<String> getInsos(ArrayList<String> firstNameData,ArrayList<String> boyNameData, ArrayList<String> girlNameData,int boyCount,int girlCount) {
        // 创建两个HashSet，用于存储随机生成的男性和女性姓名
        HashSet<String> hashSet1 = new HashSet<>();
        while (true) {
            // 循环生成 boyCount 个男性姓名组合
            if (hashSet1.size() == boyCount) {
                break;
            }
            // 对第一个女性姓名数据和男性姓名数据进行随机打乱
            Collections.shuffle(firstNameData);
            Collections.shuffle(boyNameData);
            // 将随机打乱后的女性姓名数据和男性姓名数据组合添加到 hashSet1 中
            hashSet1.add(firstNameData.get(0) + boyNameData.get(0));
        }
        HashSet<String> hashSet2 = new HashSet<>();
        while (true) {
            // 循环生成 girlCount 个女性姓名组合
            if (hashSet2.size() == girlCount) {
                break;
            }
            // 对第一个女性姓名数据和女性姓名数据进行随机打乱
            Collections.shuffle(firstNameData);
            Collections.shuffle(girlNameData);
            // 将随机打乱后的女性姓名数据和女性姓名数据组合添加到 hashSet2 中
            hashSet2.add(firstNameData.get(0) + girlNameData.get(0));
        }
        // 创建一个 ArrayList，用于存储随机生成的男性姓名和女性姓名组合
        ArrayList<String> list = new ArrayList<>();
        // 创建一个 Random 对象，用于生成随机数
        Random r = new Random();
        // 将 hashSet1 中的每个元素拼接上 "-男-" 和一个随机数，然后添加到 list 中
        for (String s : hashSet1) {
            list.add(s + "-男-" +(r.nextInt(9) + 18));
        }
        // 将 hashSet2 中的每个元素拼接上 "-女-" 和一个随机数，然后添加到 list 中
        for (String s1 : hashSet2) {
            list.add(s1 + "-女-" +(r.nextInt(7) + 18));

        }

        // 返回随机生成的男性姓名和女性姓名组合
        return list;
    }

    // 从firstName中按照index匹配出字符串，并将匹配到的字符串添加到list中，返回list
private static ArrayList<String> getData(String firstName, String index, int i) {
        ArrayList<String> list = new ArrayList<>();
        // 编译index正则表达式
        Pattern pattern = Pattern.compile(index);
        // 匹配firstName
        Matcher ma = pattern.matcher(firstName);
        // 遍历匹配到的字符串
        while (ma.find()) {
            // 获取匹配到的第i个字符串
            String str = ma.group(i);
            // 将字符串添加到list中
            list.add(str);
        }
        // 返回list
        return list;
    }


    public static String getNamesNet(String url) throws IOException {
        // 创建一个URL对象，指定URL参数
        URL net = new URL(url);
        // 创建一个StringBuilder对象，用于拼接字符串
        StringBuilder sb = new StringBuilder();
        // 打开URL连接
        URLConnection str = net.openConnection();
        // 创建一个InputStreamReader对象，用于读取输入流
        InputStreamReader reader = new InputStreamReader(str.getInputStream(), StandardCharsets.UTF_8);
        // 定义一个变量，用于读取字符
        int ch;
        // 循环读取输入流，直到读取到-1
        while ((ch = reader.read()) != -1) {
            // 将读取到的字符拼接到StringBuilder对象中
            sb.append((char) ch);
        }
        // 关闭输入流
        reader.close();
        // 返回拼接好的字符串
        return sb.toString();
    }
}
